﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using Conexion;
using System.Threading;
using System.IO;
using System.Net;

namespace Agente
{
    class MessageHandler
    {
        private SystemInfo sistema = null;
        private Config conf = null;
        private const string CMD_RAM = "01";
        private const string CMD_CPU = "02";
        private const string CMD_DISCO = "03";

        public MessageHandler(Config conf) {
            this.conf = conf;
        }

        public void IniciarServicio() {

            sistema = SystemInfo.GetInstance();
            TcpListener listener = ListenerTCP.obtenerTcpListener(conf.Ip_agente, conf.Puerto_agente);
            listener.Start();

            TcpClient cliente;
            Console.WriteLine("Servicio levantado en el puerto " + conf.Puerto_agente +"..");
            // LOG "Comienzo a escuchar..."
            while (true)
            {
                cliente = listener.AcceptTcpClient();
                ThreadPool.QueueUserWorkItem(new WaitCallback(ProcesarMensaje), cliente);
            }
        }

        private void ProcesarMensaje(Object cliente)
        {
            TcpClient tcpClient = (TcpClient)cliente;
            NetworkStream ns;
            byte[] datos = new byte[5];
            string hdr = "";
            string cmd = "";
            string response = "RES";
            bool valido = true;

            ns = tcpClient.GetStream();
            ns.Read(datos, 0, 3);
            hdr = Encoding.UTF8.GetString(datos).Substring(0, 3);

            if (hdr.Equals("REQ"))
            {
                ns.Read(datos, 0, 2);
                cmd = Encoding.UTF8.GetString(datos).Substring(0, 2);
                
                Socket s = tcpClient.Client;
                if (conf.Ip_manager.Equals(((IPEndPoint)s.RemoteEndPoint).Address.ToString()))
                {
                    response += cmd;
                    switch (cmd)
                    {
                        case CMD_RAM:
                            response += sistema.ObtenerInfoRAM();
                            break;
                        case CMD_DISCO:
                            response += sistema.ObtenerInfoDISCO();
                            break;
                        case CMD_CPU:
                            response += sistema.ObtenerInfoCPU();
                            break;
                        default:
                            Console.WriteLine("Default case");
                            break;
                    }
                }
                else
                {
                    Console.WriteLine("Peticion desde manager no autenticado");
                    valido = false;
                }

            }
            else
            {
                //throw ex
            }
            if (valido)
            {
                byte[] datosRespuesta = Encoding.UTF8.GetBytes(response);
                StreamWriter str = new StreamWriter(tcpClient.GetStream());
                str.Write(response);
                str.Flush();
            }
        }

    }
}
